﻿#ifndef XNET_TINY_H
#define XNET_TINY_H

// 物理层的定义

#include <stdint.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

#define min(a, b) ((a) < (b) ? (a) : (b))

// 包的最大长度
#define XNET_CFG_PACKET_MAX_SIZE 1516

typedef uint32_t xnet_time_t; // 时间类型，返回当前系统跑了多少个100ms
// 工具
// 交换16位，从大端法到小端法
uint16_t swap_order16(uint16_t v);
uint32_t swap_order32(uint32_t v);

// 底层包的定义
typedef struct _xnet_packet_t
{
    uint16_t size;
    uint8_t *data;
    uint8_t payload[XNET_CFG_PACKET_MAX_SIZE];
} xnet_packet_t;

static xnet_packet_t tx_packet, rx_packet; // 接收与发送缓冲区

xnet_packet_t *xnet_alloc_for_read(uint16_t data_size);
xnet_packet_t *xnet_alloc_for_send(uint16_t data_size);

void add_header(xnet_packet_t *packet, uint16_t header_size);
void remove_header(xnet_packet_t *packet, uint16_t header_size);
void truncate_packet(xnet_packet_t *packet, uint16_t size);

int xnet_check_tmo(xnet_time_t *time, uint32_t sec);

#define XNET_IPV4_ADDR_SIZE 4
// ip地址的联合体，操作array和addr是等价的
typedef union _xipaddr_t
{
    uint8_t array[XNET_IPV4_ADDR_SIZE];
    uint32_t addr;
} xipaddr_t;

extern const xipaddr_t my_ip; // 我自己定义的ip地址
// 以太网广播地址
extern const uint8_t ether_broadcast[];

// 判断目标ip和我自己的ip是否相等，缓冲区
int xipaddr_is_equal_buf(xipaddr_t myip, uint8_t *target);
// 判断目标ip和我自己的ip是否相等，32位数字
int xipaddr_is_equal(xipaddr_t my_ip, uint32_t target);

#endif // XNET_TINY_H
